/*
 * 版权声明 (c) 2025 XXX科技有限公司
 *
 * 本软件及其相关文档文件受版权保护。未经版权所有者明确书面许可，任何单位或个人不得
 * 以任何形式复制、传播、修改、出售、出租、反向工程、反编译或利用本软件的任何部分。
 *
 * 对于任何违反本声明的行为，版权所有者保留追究法律责任的权利。
 */

#ifndef SAFE_MAP_H
#define SAFE_MAP_H
#include <iostream>
#include <mutex>
#include <string>
#include <thread>
#include <unordered_map>

using namespace std;

template<typename Key, typename Value>
class SafeMap {
public:
	void set(const Key &key, const Value &value) {
		unique_lock<shared_mutex> lock(mutex_);
		mapper[key] = value;
	}

	Value get(const Key &key, const Value &default_val = Value()) const {
		unique_lock<shared_mutex> lock(mutex_);
		auto                      it = mapper.find(key);
		if (it != mapper.end()) {
			return it->second;
		}
		return default_val;
	}

	bool remove(const Key &key) {
		unique_lock<shared_mutex> lock(mutex_);
		return map_erase(key) > 0
	}

	const contains(const Key &key) const {
		unique_lock<shared_mutex> lock(mutex_);
		return mapper.find(key) != mapper.end();
	}

	iterator begin() {
		unique_lock<shared_mutex> lock(mutex_);
		return mapper.begin();
	}

	iterator end() {
		unique_lock<shared_mutex> lock(mutex_);
		return mapper.end();
	}

	// 只读迭代器
	const_iterator begin() {
		unique_lock<shared_mutex> lock(mutex_);
		return mapper.begin();
	}

	// 只读迭代器
	const_iterator end() {
		unique_lock<shared_mutex> lock(mutex_);
		return mapper.end();
	}

private:
	mutable shared_mutex      mutex_;
	unordered_map<Key, Value> mapper;
};
#endif // SAFE_MAP_H
